package codeblock;

public class CodeBlockDetail01 {
    public static void main(String[] args) {
//         类什么时候被加载
        //1.创建对象实例时（new）
        //AA aa = new AA();
        //2.创建子类对象实例，父类也会被加载,且父类先被加载，子类后被加载
        //AA aa2 = new AA();
        //3.使用类的静态成员时（静态属性，静态方法）
        //System.out.println(Cat.age);

        //static 修饰的代码块,在类加载时，执行，且只会执行一次
//        DD dd = new DD();
//        DD dd2 = new DD();
//普通的代码块，在创建对象实例时，会被隐式的调用，被创建一次，就会调用一次

        //如果只是使用类的静态成员时，普通代码块并不会执行
        System.out.println(DD.n1);//静态代码块一定会调用，普通代码块不会调用
        //和类加载无关，可以理解为普通代码块是构造器的一个补充
        //构造器被调用，普通代码块就被调用；构造器没被调用，普通代码块不会被调用
    }
}

class DD {
    public static int n1 = 8888;
    //静态代码块
    static {
        System.out.println("DD 的静态代码块1被执行...");
    }
   //普通代码块
    {
        System.out.println("DD的普通代码块被执行...");
    }
}
class Animal {
    //静态代码块
    static {
        System.out.println("Animal 的静态代码块1被执行...");
    }
}
class Cat extends Animal{
    public static int age = 4;

    static {
        System.out.println("Cat 的静态代码块1被执行...");
    }
}

class BB {
    //静态代码块
    static {
        System.out.println("BB的静态代码1被执行...");
    }
}

class AA extends BB {

    //静态代码块
    static {
        System.out.println("AA的静态代码1被执行...");
    }
}
